package com.shop.cereshop.app.dao.buyer;

import com.shop.cereshop.app.page.buyer.blacklist.BuyerBlacklistVO;
import com.shop.cereshop.app.param.buyer.blacklist.QueryBlacklistDTO;
import com.shop.cereshop.commons.domain.buyer.BuyerUserBlacklist;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @description: 用户黑名单
 * @author zdd
 * @date 2025/11/12 16:22
 * @version 1.0
 */
@Mapper
public interface BuyerUserBlacklistMapper {

    int insert(BuyerUserBlacklist blacklist);

    int update(BuyerUserBlacklist blacklist);

    BuyerUserBlacklist selectById(@Param("id") Long id);

    /**
     * 根据某个用户ID，查询被他标记为"拉黑"和"我不看他"的被拉黑用户列表
     */
    List<Long> getBlockedHisPostsUserIds(@Param("buyerUserId") Long buyerUserId);

    /**
     * 根据某个用户ID，查询被他标记为"拉黑"的被拉黑用户列表
     */
    List<Long> getBlockedUserIds(@Param("buyerUserId") Long buyerUserId);

    /**
     * 查询我被哪些用户标记为"拉黑
     */
    List<Long> getBlockMeUserIds(@Param("myUserId") Long myUserId);

    /**
     * 检查是否在黑名单中
     */
    int checkInBlacklist(@Param("buyerUserId") Long buyerUserId, @Param("blockedUserId") Long blockedUserId);

    /**
     * 查询黑名单信息
     */
    BuyerUserBlacklist selectBlocklist(@Param("buyerUserId") Long buyerUserId, @Param("blockedUserId") Long blockedUserId);

    /**
     * 查询被谁拉黑了
     */
    List<BuyerUserBlacklist> selectBlockedByUserId(@Param("blockedUserId") Long blockedUserId);

    /**
     * 解除黑名单
     */
    int removeFromBlacklist(@Param("buyerUserId") Long buyerUserId,
                            @Param("blockedUserId") Long blockedUserId,
                            @Param("updatedBy") Long updatedBy);

    /**
     * 批量解除黑名单
     */
    int batchRemoveFromBlacklist(@Param("buyerUserId") Long buyerUserId,
                                 @Param("blockedUserIds") List<Long> blockedUserIds,
                                 @Param("updatedBy") Long updatedBy);

    /**
     * 查询过期的黑名单（用于自动解封）
     */
    List<BuyerUserBlacklist> selectExpiredBlacklists();

    /**
     * 批量更新黑名单状态
     */
    int batchUpdateStatus(@Param("ids") List<Long> ids, @Param("status") Integer status);

    /**
     * 统计用户拉黑数量
     */
    int countBlacklistByUserId(@Param("buyerUserId") Long buyerUserId);

    /**
     * 分页查询黑名单
     */
    List<BuyerBlacklistVO> selectBlacklistPage(QueryBlacklistDTO queryDTO);

    /**
     * 根据条件查询黑名单数量
     */
    int countByCondition(QueryBlacklistDTO queryDTO);

}
